package com.base.core.utils;

import cn.hutool.core.exceptions.UtilException;
import com.base.core.exception.SimpleHttpException;
import com.base.core.lang.StringUtils;
import com.base.core.constant.HttpConstants;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

/**
 * <p>
 * Url 工具类
 * </p>
 *
 * @author becker
 * @date Created in 2019/12/24 22:27
 */
public class UrlUtils {
    /**
     * 编码
     *
     * @param value str
     * @return encode str
     */
    public static String urlEncode(String value) {
        if (value == null) {
            return "";
        }
        try {
            String encoded = URLEncoder.encode(value, HttpConstants.DEFAULT_ENCODING.displayName());
            return encoded.replace("+", "%20").replace("*", "%2A")
                    .replace("~", "%7E").replace("/", "%2F");
        } catch (UnsupportedEncodingException e) {
            throw new SimpleHttpException("Failed To Encode Uri", e);
        }
    }

    /**
     * 解码URL<br>
     * 将%开头的16进制表示的内容解码。
     *
     * @param url URL
     * @return 解码后的URL
     * @throws UtilException UnsupportedEncodingException
     */
    public static String urlDecode(String url) throws UtilException {
        if (StringUtils.isEmpty(url)) {
            return url;
        }
        try {
            return URLDecoder.decode(url, HttpConstants.DEFAULT_ENCODING.displayName());
        } catch (UnsupportedEncodingException e) {
            throw new SimpleHttpException("Unsupported encoding", e);
        }
    }

    /**
     * 是否为http协议
     *
     * @param url 待验证的url
     * @return true: http协议, false: 非http协议
     */
    public static boolean isHttpProtocol(String url) {
        if (StringUtils.isEmpty(url)) {
            return false;
        }
        return url.startsWith("http://");
    }

    /**
     * 是否为https协议
     *
     * @param url 待验证的url
     * @return true: https协议, false: 非https协议
     */
    public static boolean isHttpsProtocol(String url) {
        if (StringUtils.isEmpty(url)) {
            return false;
        }
        return url.startsWith("https://");
    }

    /**
     * 是否为本地主机（域名）
     *
     * @param url 待验证的url
     * @return true: 本地主机（域名）, false: 非本地主机（域名）
     */
    public static boolean isLocalHost(String url) {
        return StringUtils.isEmpty(url) || url.contains("127.0.0.1") || url.contains("localhost");
    }
}
